const {List} = require('immutable')

// const list = new List([1,2,3,4,5]) 错误的

const list = List([1,2,3,4,5])
// console.log(list)

// List.isList() 用法判断是否为immutable的List类型
console.log(List.isList(list))
console.log(List.isList([1,2,3,4]))

// List.of() 创建新的list
const l = List.of(1,2,3,4,5)
// console.log(l)

// size 取List的长度
console.log(l.size) // 5

// set方法设定指定的下标的值，set(下标, 值)
// 可以设置超出list长度的位置，默认填充为undefined
//  下标可以为负数
l2 = l.set(10, 10)
console.log(l2._tail.array) // [ 1, 2, 3, 4, 5, <5 empty items>, 10 ]

// delete 删除指定下标，delete(下标)
const l3 = l2.delete(-1)
console.log(l3._tail.array) // [ 1, 2, 3, 4, 5, <5 empty items> ]

// insert插入， insert(下标, 值)，性能不好（会把完整的数组进行拷贝）
const l4 = l3.insert(0, 100)
console.log(l4._tail.array) // [ 100, 1, 2, 3, 4, 5 ]

// update更新指定下标的值 update(下标， callback)
const l5 = l4.update(0, x => x + 100)
console.log(l5._tail.array) // [ 200, 1, 2, 3, 4, 5 ]

// clear清空，返回一个长度为0的新数组
const l6 = l5.clear()
console.log(l5._tail.array) // [ 200, 1, 2, 3, 4, 5 ]
console.log(l6.size) // 0

// 重新设定长度setSize, 小于原来的长度会截断，大于原来的长度会用undefined填充
const l7 = l.setSize(3)
console.log(l7._tail.array) // [ 1, 2, 3 ]
const l8 = l.setSize(10)
console.log(l8.size) // 10

// setIn() 原来设定嵌套结构的值（[第一层下标， 第二层下标.....], 值）
// 同理有deleteIn, insertIn, updateIn
const arr = List([
    List([1,2,3,4]),
    List([11,12,13,14]),
    List([21,22,23,24]),
])
const arr1 = arr.setIn([2, 1], 100)
console.log(arr1._tail.array[2]._tail.array) // [ 21, 100, 23, 24 ]

// concat/merge(concat的别名) 连接List
const list1 = List([1,2,3,4])
const list2 = List([6,7,8])
const list3 = List([33,444])
const totalist = list1.concat(list2, list3)
console.log(totalist._tail.array) // [1, 2,  3,   4, 6,7, 8, 33, 444]

// map同原生的map，循环并返回新的List
const list4 = list1.map(item => item ) // map内部可以接收一个function对数组进行处理和过滤
console.log(list4._tail.array) // [ 1, 2, 3, 4 ]

// filter同原生的filter， 循环过滤返回新的List
const list5 = list1.filter(item => item > 2 ) // filter内部可以接收一个function对数组进行处理和过滤,，filter可以直接返回值
// const list5 = list1.map(item => {if (item > 2) {return item}}) // [ undefined, undefined, 3, 4 ] 和map的区别
console.log(list5._tail.array) // [ 3, 4 ]

// flatten扁平list
const fl1 = List([
    List([1,2,3,4]),
    List([11,12,13,14]),
    List([21,22,23,24]),
])
const fl2 = fl1.flatten(true) // false：只拉平一层； true：全部拉平；可以往里边输入值，表示拉平n层
console.log(fl2._tail.array) // [1,  2,  3,  4, 11,12, 13, 14, 21, 22,23, 24]

// find 查找, 返回第一个符合的结果
const names = List(['张山', '张2', '张3', '张吴'])
const names2 = names.find((v, key) => v.indexOf('张')!== -1)
console.log(names2) //张山

// findLast 查找，返回最后一个符合的结果
const names3 = List(['张山', '张2', '张3', '张吴'])
const names4 = names3.findLast((v, key) => v.indexOf('张')!== -1)
console.log(names4) // 张吴

// keys返回所有的下标
const keys = names.keys();
// console.log('keys:', keys)
for(const k of keys) {
    console.log('k:', k)
}

// values返回所有的值
const values = names.values()
for (const v of values) {
    console.log('value:', v)
}

// entries返回所有的entry， (key, value)形式
const entries = names.entries()
for (const entry of entries) {
    console.log('entry:', entry)
}

// groupBy分组
const people = List([
    {sex:'male', name:'zhangs'},
    {sex:'male', name:'zhang5'},
    {sex:'male', name:'zhang2'},
    {sex:'female', name:'mali'},
])
const gp = people.groupBy(x => x.sex)
// console.log('gp:', gp)

